package Store

type tableTypeId int

const (
	Dns = iota
	Object
	Parameter
	Run
	Kill
	Task
	Position
	AutoIncrementMeta
	TablesMeta
	MissTableMeta
)

type TableName struct {
	DnsInfo           DnsInfo       `json:"dnsInfo.db"`
	ObjectInfo        ObjectInfo    `json:"object.db"`
	Parameter         ParameterInfo `json:"parameter.db"`
	RunTask           RunTaskInfo   `json:"runTask.db"`
	Kill              RunKillInfo   `json:"kill.db"`
	Position          PositionInfo  `json:"position.db"`
	AutoIncrementMeta AutoIncrement `json:"autoIncrement.db"`
	TablesMeta        TablesData    `json:"tables.db"`
	MissTableData     MissTableData `json:"miss.db"`
}

func getTableTypeStr(query tableTypeId) string {
	switch query {
	case Dns:
		return "dnsInfo.db"
	case Object:
		return "object.db"
	case Parameter:
		return "parameter.db"
	case Task:
		return "task.db"
	case Run:
		return "runTask.db"
	case Kill:
		return "kill.db"
	case Position:
		return "position.db"
	case AutoIncrementMeta:
		return "autoIncrement.db"
	case TablesMeta:
		return "tables.db"
	case MissTableMeta:
		return "miss.db"
	default:
		return ""
	}
}

type DnsInfo struct {
	Key             string
	Seq             int    `json:"id"`
	Name            string `json:"name"`
	Type            string `json:"type"`
	Ip              string `json:"ip"`
	Port            int    `json:"port"`
	User            string `json:"user"`
	Password        string `json:"password"`
	Sid             string `json:"sid"`
	DefaultDatabase string `json:"defaultDatabase"`
}
type TaskInfo struct {
	TaskId     int    `json:"id"`
	ObjectName string `json:"taskName"`
}

type ParameterInfo struct {
	TaskId     int    `json:"id"`
	ObjectName string `json:"objectName"`
	DbName     string `json:"dbName"`
	Record     []byte `json:"record"`
}
type RunKillInfo struct {
	TaskId     int    `json:"id"`
	ObjectName string `json:"objectName"`
	Mode       string `json:"mode"`
	Status     string `json:"status"`
	Info       string `json:"info"`
}
type RunTaskInfo struct {
	TaskId     int    `json:"id"`
	ObjectName string `json:"objectName"`
	Mode       string `json:"mode"`
	Status     string `json:"status"`
}
type PositionInfo struct {
	Key        string //key信息
	TaskId     int    `json:"id"`
	ObjectName string `json:"objectName"`
	Drive      string `json:"drive"`
	TimeStamp  string `json:"timeStamp"`
	Position   string `json:"position"`
}
type ObjectInfo struct {
}

var (
	//Rows struct {
	//	RowsSum      *int64 `json:"rowsSum"`
	//	SourceNumber *int64 `json:"srcCount"`
	//	DestNumber   *int64 `json:"dstCount"`
	//	InsertSum    *int64 `json:"insertSum"`
	//	UpdateSum    *int64 `json:"updateSum"`
	//	DeleteSum    *int64 `json:"DeleteSum"`
	//}
	//Sync struct {
	//	SyncSum    *int64 `json:"syncRows"`   //表的实际行数
	//	SelectRows *int64 `json:"selectRows"` //源端查询装填
	//	InsertRows *int64 `json:"insertRows"` //目标端写入状态
	//}
	//Struct struct {
	//	Role        string `json:"role"`
	//	IssueType   string `json:"issue Type"`
	//	DataFixType string `json:"fix Type"`
	//	ExecObject  string `json:"execObject"`
	//	ExecResult  string `json:"execStat"`
	//}
	//Object struct {
	//	Role        string `json:"role"`
	//	IssueType   string `json:"issue Type"`
	//	DataFixType string `json:"fix Type"`
	//	ExecObject  string `json:"execObject"`
	//	ExecResult  string `json:"execStat"`
	//}
	//Task struct {
	//	Sum            *int64 `json:"Sum"` //表的实际行数
	//	LobCN          string
	//	VarcharCN      string
	//	TextCN         string
	//	TextCT         string
	//	PType          string
	//	PSum           int64
	//	Histogram      string  `json:"histogram"` //源端查询装填
	//	RateEvaluation string  `json:"rate"`
	//	DataSize       float64 `json:"dataSize(MB)"`
	//}
	//HotSql struct {
	//	SourceNumber *int64 `json:"srcCount"`
	//	DestNumber   *int64 `json:"dstCount"`
	//	QpsSum       *int64 `json:"qps Sum"`
	//	SelectNum    *int64 `json:"select Num"`
	//	InsertNum    *int64 `json:"insert Num"`
	//	UpdateNum    *int64 `json:"update Num"`
	//	DeleteNum    *int64 `json:"delete Num"`
	//}
	//Load struct {
	//	SyncSum    *int64 `json:"syncSum"`    //表的实际行数
	//	SelectRows *int64 `json:"selectRows"` //源端查询装填
	//	InsertRows *int64 `json:"insertRows"` //目标端写入状态
	//}
	TPod struct {
		Seq             int    `json:"seq"` //task打印的任务序号
		Schema          string `json:"schema"`
		Table           string `json:"table"`
		CheckMode       string `json:"mode"`
		Options         string `json:"options"`
		Role            string `json:"role"`
		IndexName       string `json:"indexName"`
		CardinalityRate string
		IndexType       string `json:"indexType"`
		IndexCol        string `json:"indexCol"`
		//Rows            Rows   `json:"rows"`
		//Sync            Sync   `json:"sync"`
		//Struct          Struct `json:"struct"`
		//Object          Object `json:"object"`
		//Task            Task   `json:"task"`
		//HotSql          HotSql `json:"hotSql"`
		//Load            Load   `json:"load"`
		Result    string `json:"result"`
		TableMiss bool
		Status    *int64 //表状态
	}
)

type AutoIncrement struct {
	Tables uint64 `json:"tables"` //object next_id
}

// TablesData 存储的是对象名，key:schema+table+mSchema+mTable+type ,value:schema + objectName
type TablesData struct {
	Id       uint64   `json:"autoIncrementId"` //Id
	Schema   string   `json:"schema"`          //库名
	Table    string   `json:"table"`           //表名
	MSchema  string   `json:"mSchema"`         //映射的库名
	MTable   string   `json:"mTable"`          //映射的表名
	Role     string   `json:"role"`            //对象类型
	TaskName string `json:"taskName"`        //关联任务名
}
type MissTableData struct {
	TablesData
	MissTable bool `json:"missTable"`
}

// TablesDataIndex 存储的是索引，key:tables+next_id ,value:tableData.id
type TablesDataIndex struct {
	TaskName    string
	ModeOptions string
	TableDataId string
	//ModeName []string //关联的模式名
	//TaskName []string //关联任务名
}

// ModesData 存储的是模式，key:modes+next_id ,value:mode[rows:check,task:start,rows:sync]
type ModesData struct {
	Id      string
	Mode    string
	SubMode string
}
type TaskData struct {
}
type ObjectData struct {
	ObjectName string
	ObjectType string
	ObjectMode string
	ObjectInfo string
}
type TaskSchedule struct {
	DbName string
}
